home *** CD-ROM | disk | FTP | other *** search
/ SGI Desktop Special Edition 1.1 / SGI Desktop Special Edition 1.1.iso / dist / patchSG0000926.idb / usr / include / sys / rrm.h.z / rrm.h
Encoding:
C/C++ Source or Header  |  1995-11-13  |  13.2 KB  |  381 lines

  1. #ifndef __SYS_RRM_H__
  2. #define __SYS_RRM_H__
  3. /**************************************************************************
  4.  *         Copyright (C) 1990, Silicon Graphics, Inc.          *
  5.  *  These coded instructions, statements, and computer programs     contain  *
  6.  *  unpublished     proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may    not be disclosed  *
  8.  *  to    third  parties    or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  **************************************************************************/
  11.  
  12. /*
  13.  *   $Revision: 1.59 $
  14.  */
  15. #include <sys/gfx.h>
  16.  
  17. /*
  18.  * Device independent rendering resources that can be requested
  19.  */
  20. #define    RRM_RMASK_PCX        0x00000001    /* graphics context */
  21. #define    RRM_RMASK_CLIP        0x00000002    /* clipping region */
  22. #define    RRM_RMASK_BUFFER    0x00000004    /* buffer (double buffering) */
  23. #define    RRM_RMASK_SWAPBUF    0x00000008    /* ability to swap buffers */
  24.  
  25. #define    RRM_RMASK_RETRACE    0x00000010    /* retrace event occurred  */
  26. #define    RRM_RMASK_MESSAGE    0x00000020    /* messaged manager */
  27. #define    RRM_RMASK_READ        0x00000040    /* readable region */
  28. #define    RRM_RMASK_ALL        (RRM_RMASK_PCX         | \
  29.                  RRM_RMASK_CLIP     | \
  30.                  RRM_RMASK_BUFFER   | \
  31.                  RRM_RMASK_SWAPBUF  | \
  32.                  RRM_RMASK_RETRACE  | \
  33.                  RRM_RMASK_MESSAGE  | \
  34.                  RRM_RMASK_READ)
  35.  
  36. /*
  37.  * rendering resource manager operations
  38.  *
  39.  * WARNING!  These RRM command numbers are used as an index into the
  40.  * RRMfncs table so if they change, so must the RRMfncs table.
  41.  */
  42. #define RRM_BASE          1000
  43. #define RRM_OPENRN          (RRM_BASE+0)  /* open rendering node */
  44. #define RRM_CLOSERN          (RRM_BASE+1)  /* close rendering node */
  45. #define RRM_BINDPROCTORN      (RRM_BASE+2)  /* set current RN for proc */
  46. #define RRM_BINDRNTOCLIP      (RRM_BASE+3)  /* bind RN to given clip region */
  47. #define RRM_UNBINDRNFROMCLIP  (RRM_BASE+4)  /* unbind RN from clip region */
  48. #define RRM_SWAPBUF          (RRM_BASE+5)  /* swap buffers */
  49. #define RRM_SETSWAPINTERVAL   (RRM_BASE+6)  /* swapinterval */
  50. #define RRM_WAITFORRETRACE    (RRM_BASE+7)  /* wait for retrace */
  51. #define RRM_SETDISPLAYMODE    (RRM_BASE+8)  /* display mode */
  52. #define RRM_MESSAGE          (RRM_BASE+9)  /* send message to board mgr */
  53. #define RRM_INVALIDATERN      (RRM_BASE+10) /* invalidate resources in a RN */
  54. #define RRM_VALIDATECLIP      (RRM_BASE+11) /* validate a RN's clip resource */
  55. #define RRM_VALIDATESWAPBUF   (RRM_BASE+12) /* validate swap buffer ability */
  56.                   /* XXX 13 available */
  57. #define RRM_VALIDATEBUFFER    (RRM_BASE+14) /* validate current buffer */
  58. #define RRM_VALIDATEMESSAGE   (RRM_BASE+15) /* ack message */
  59. #define RRM_GETDISPLAYMODES   (RRM_BASE+16) /* get display mode registers */
  60. #define RRM_LOADDISPLAYMODE   (RRM_BASE+17) /* display mode */
  61. #define RRM_MGR_SWAPBUF          (RRM_BASE+20)  /* board manager swap buffer */
  62. #define RRM_SETVSYNC          (RRM_BASE+21) /* set vsync counter */
  63. #define RRM_GETVSYNC          (RRM_BASE+22) /* get vsync counter */
  64. #define RRM_WAITVSYNC        (RRM_BASE+23)  /* wait on vsync counter */
  65. #define RRM_BINDRNTOREADANDCLIP (RRM_BASE+24) /* bind RN to separate read/clip */
  66. #define RRM_CMD_LIMIT          (RRM_BASE+100)
  67.  
  68. /*
  69.  * argument structures
  70.  *
  71.  * WARNING!  These structs MUST have rnid as their first argument.
  72.  */
  73.  
  74. struct RRM_OpenRN {
  75.     int        rnid;        /* rendering node ID */
  76.     unsigned int    rmask;        /* resource mask: ones needed */
  77. };
  78.  
  79. struct RRM_CloseRN {
  80.     int        rnid;        /* rendering node ID */
  81. };
  82.  
  83. struct RRM_BindProcToRN {
  84.     int        rnid;        /* rendering node ID */
  85. };
  86.  
  87. struct RRM_BindRNToClip {
  88.     int        rnid;        /* rendering node ID */
  89.     int        clipid;        /* opaque clip region ID */
  90. };
  91.  
  92. struct RRM_UnbindRNFromClip {
  93.     int        rnid;        /* rendering node ID */
  94.     int        clipid;         /* opaque clip region ID */
  95. };
  96.  
  97. struct RRM_SwapBuf {
  98.     int        rnid;        /* rendering node ID */
  99.     int        hwd_mode;    /* hardware dependent register value */
  100.     int        hwi_mode;    /* hardware independent disp mode description (M_) */
  101. };
  102.  
  103. struct RRM_MGR_SwapBuf {
  104.         int             rnid;           /* rendering node ID */
  105.     int        swapbufid;    /* hardware DID */
  106.     int        clipid;        /* opaque clip region ID */
  107.     int        hwd_mode;    /* hardware dependent register value */
  108.     int        hwi_mode;    /* hardware independent disp mode description (M_) */
  109. };
  110.  
  111. struct RRM_SetSwapInterval {
  112.     int        rnid;        /* rendering node ID */
  113.     int        swapinterval;    /* number of frames between swaps */
  114. };
  115.  
  116. struct RRM_WaitForRetrace {
  117.     int        rnid;        /* rendering node ID */
  118. };
  119.  
  120. struct RRM_SetDisplayMode {
  121.     int        rnid;        /* rendering node ID */
  122.     int        hwd_mode;    /* hardware dependent register value */
  123.     int        hwi_mode;    /* hardware independent mode description (M_) */
  124. };
  125.  
  126. struct RRM_LoadDisplayMode {
  127.         int             rnid;           /* rendering node ID */
  128.         int             clipid;         /* clip region ID */
  129.     int        wid;        /* window ID that should be used */
  130.     int        hwd_mode;    /* hardware dependent register value */
  131.     int        hwi_mode;    /* hardware independent mode description (M_) */
  132. };
  133.  
  134. struct RRM_GetDisplayModes {
  135.     int        rnid;        /* rendering node ID */
  136.     int        *buf;        /* buffer for mode descriptions (M_) */
  137.     unsigned int    len;        /* length of buffer passed */
  138. };
  139.  
  140. struct RRM_InvalidateRN {
  141.         int             rnid;           /* rendering node ID */
  142.         int             clipid;         /* clip region ID */
  143.     unsigned int    rmask;        /* resource mask: ones to invalidate */
  144.     unsigned int    hwi_mode;    /* return value - mode window wants */
  145.     unsigned int    flags;        /* input/output flags */
  146. };
  147. /* flags for RRM_InvalidateRN.flags */
  148. #define    RRM_INVAL_WRONGBUF    0x1    /* return: DID left in wrong buffer */
  149.  
  150. struct RRM_PieceList {            /* window clipping piece list piece */
  151.     int        x;        /* lower left x */
  152.     int        y;        /* lower left y */
  153.     int        xsize;        /* size in x */
  154.     int        ysize;        /* size in y */
  155. };
  156.  
  157. /* These arguments are interpreted by the dev. dependent graphics drivers.
  158.    All arguments are not used by all drivers.
  159.    We can probably simplify this interface. */
  160. struct RRM_ValidateClip {
  161.         int             rnid;           /* rendering node ID */
  162.     int        clipid;        /* clip region ID */
  163.     int        xorg;        /* window x origin */
  164.     int        yorg;        /* window y origin */
  165.     int        xsize;        /* window x size */
  166.     int        ysize;        /* window y size */
  167.     int        numpieces;    /* number pieces in clip region */
  168.     struct RRM_PieceList *piecelist;/* window clipping piece list:
  169.                        can be NULL (e.g. numpieces=1) */
  170.     int        wid;        /* window ID that should be used */
  171.     int        obscured;    /* window obscured =1, else =0 */
  172.     int        widcheck;    /* WID check enabled =1, else =0 */
  173.     int        changed;    /* window moved =1, shrunk =2, else =0*/
  174.     unsigned int    hwi_mode;    /* current hwi mode for window */
  175.     int        fblayer;    /* frame buffer layer */
  176. };
  177.  
  178. struct RRM_ValidateSwapBuf {
  179.         int             rnid;           /* rendering node ID */
  180.     int        clipid;        /* clip region ID */
  181.     int        swapbufid;    /* opaque swap buffers ID */
  182. };
  183.  
  184. struct RRM_ValidateBuffer {
  185.     int        rnid;        /* rendering node ID */
  186. };
  187.  
  188. struct RRM_ValidateMessage {
  189.     int        rnid;        /* rendering node ID */
  190. };
  191.  
  192. struct RRM_SetVideoSync {
  193.         int        rnid;        /* rendering node ID */
  194.     unsigned int    count;        /* new counter value */
  195. };
  196.   
  197. struct RRM_GetVideoSync {
  198.         int        rnid;        /* rendering node ID */
  199.     unsigned int    count;        /* returned counter value */
  200. };
  201.   
  202. struct RRM_WaitVideoSync {
  203.         int        rnid;        /* rendering node ID */
  204.     int        interval;    /* interval at wakeup */
  205.     int        mod;        /* remainder at wakeup */
  206.     unsigned int    count;        /* returned counter value */
  207. };
  208.   
  209. struct RRM_BindRNToReadAndClip {
  210.     int        rnid;        /* rendering node ID */
  211.     int        clipid;        /* opaque clip region ID */
  212.     int        readclipid;    /* opaque clip region ID */
  213. };
  214.  
  215. /*
  216.  * Messege types being sent to board manager.
  217.  */
  218. #define    RRM_MSG_VALIDATECLIP    1    /* validate a given clip region */
  219. #define    RRM_MSG_VALIDATESWAPBUF    2    /* validate ability to swap buffers */
  220. #define RRM_MSG_SWAP_N_CLIP    3    /* atomic ValidateSwap and ValidateClip */
  221. #define    RRM_MSG_BINDRNTOCLIP    4    /* bind given RN to given clip region */
  222. #define    RRM_MSG_UNBINDRNFROMCLIP 5    /* unbind given RN from clip region */
  223. #define RRM_MSG_MGR_SWAPDONE    9    /* board manager swap complete */
  224. #define RRM_MSG_SWAP_INITIATED    10    /* OpenGL requested swap */
  225. #define    RRM_MSG_SETDISPLAYMODE    11    /* set display mode */
  226.  
  227.     /*  these are generated by a GL program */
  228. #define    RRM_MSG_FULLSCREEN    6    /* turn clipping off/on */
  229. #define    RRM_MSG_ZBUFFERED    7    /* notify zbuffering */
  230. #define    RRM_MSG_DONTFREEZE    8    /* dont freeze proc when win unmapped */
  231.  
  232. #define RRM_OGL_MSG_BIT            0x80 /* Open GL */
  233. #define RRM_MSG_CMD_MASK        0x7f /* Open GL */
  234.  
  235. #define    RRM_MSG_OGL_BINDRNTOCLIP    (RRM_MSG_BINDRNTOCLIP | RRM_OGL_MSG_BIT)     /* Open GL */
  236. #define    RRM_MSG_OGL_UNBINDRNFROMCLIP    (RRM_MSG_UNBINDRNFROMCLIP | RRM_OGL_MSG_BIT) /* Open GL */
  237.  
  238.  
  239. /* Increment this number, as more message types are defined */ 
  240. #define RRM_MAX_MESSAGE_NUM    11    
  241.  
  242. #define GFX_MESSAGE_MAX_SIZE 10
  243.  
  244. struct RRM_Message_Header {
  245.     int        rnid;        /* rendering node ID */
  246.     unsigned int    rmask;        /* resource mask: ones to invalidate */
  247.     unsigned char   type;        /* message type */
  248.     int         length;        /* message length */
  249. };
  250.  
  251. struct RRM_Message_Fullscreen {
  252.     struct RRM_Message_Header header;
  253.     int clipid;
  254.     int rnid;
  255.     unsigned int flag;
  256. };
  257.  
  258. struct RRM_Message_Dontfreeze {
  259.     struct RRM_Message_Header header;
  260.     int clipid;
  261.     int rnid;
  262.     unsigned int flag;
  263. };
  264.  
  265. #ifdef _KERNEL
  266.  
  267. struct RRM_Message {
  268.     struct RRM_Message_Header header;
  269.     unsigned int data[GFX_MESSAGE_MAX_SIZE]; 
  270. };
  271.     
  272. /*
  273.  *   structure of an rrm message going upstream
  274.  */
  275.  
  276. struct gfx_rrm_message {
  277.     struct gfx_board *board;
  278.     unsigned char type;
  279.     int size;
  280.     unsigned int arg[GFX_MESSAGE_MAX_SIZE];
  281. };
  282.  
  283. /*
  284.  * PaneCache element
  285.  */
  286. struct pane {
  287.     int    p_clipid;        /* opaque clip id - that's window to you buddy */
  288.     int    p_serial;        /* serial number for validate clip */
  289.     short  p_validmask;        /* resources which are valid */
  290.     short  p_waitmask;        /* resources awaiting validation */
  291.     short  p_rncnt;        /* reference count for number of bindies */
  292.     short  p_displaybank;    /* currently displayed buffer */
  293.     int    p_swapbufid;        /* opaque display id, for buffer swapping */
  294.     int    p_swapinterval;    /* swap interval for this pane */
  295.     uint   p_nextswaptime;    /* last swap time for this pane */
  296.     uint   p_hwi_mode;        /* opaque HW indep. display mode */
  297.     sema_t p_sema;        /* must have this to request validation */
  298.     struct gfx_gfx *p_sema_owner;
  299.     sema_t p_wait;        /* sleep on this to wait for validation */
  300.     sema_t p_bwait;        /* sleep on this to wait for a buffer event */
  301.     lock_t p_lock;        /* for MP weenies */
  302.     struct gfx_data *p_bdata;    /* remember the board, so we can support multiple boards && get at the gfx semaphore */
  303.     struct RRM_ValidateClip p_vclip;    /* current clip */
  304. };
  305.  
  306. /*
  307.  * Device INDEPENDENT rendering node structure
  308.  */
  309. struct rrm_rnode {
  310.     union {
  311.         int    gr_rnid;
  312.         struct {
  313.             short incarn;
  314.             short rnid;
  315.         } rnid;
  316.     } gr_rnid;
  317.     unsigned short    gr_reqmask;    /* rendering resource request mask */
  318.     unsigned short    gr_validmask;    /* rendering resource valid mask */
  319.     void        *gr_pcx;    /* pipe context pointer */
  320.     int        gr_pcxsize;    /* pipe context size (in bytes) */
  321.     int        gr_clipid;    /* opaque clip region ID */
  322.     int        gr_readclipid;    /* opaque clip region ID */
  323.     int        gr_swapbufid;    /* opaque swap buffers ID */
  324.     int        gr_swapinterval;/* swap interval for this RN */
  325.     uint        gr_nextswaptime;/* last swap time for this RN */
  326.     struct rrm_rnode *gr_vrwaitnext;/* next RN waiting for retrace */
  327.     sema_t        gr_rnwait;    /* sleep on this RN */
  328.     struct gfx_gfx    *gr_creategfxp;    /* gfx struct which opened this RN */
  329.     struct gfx_gfx    *gr_gfxp;    /* gfx struct using this RN */
  330.     short        gr_pcxid;    /* context ID on rendering node */
  331.     char        gr_free;    /* RN is free if 1, allocated if 0 */
  332.     char        gr_init;    /* 1 if done initial pcx validation */
  333.     char        gr_inuse;    /* RN is bound to a proc if 1 */
  334.     struct rrm_rnode *gr_older;    /* next older rnp (pcxid allocation) */
  335.     struct rrm_rnode *gr_newer;    /* next newer rnp (pcxid allocation) */
  336.     lock_t        gr_rnlock;    /* lock for this RN (MP) */
  337.     void        *gr_private;    /* pointer to device dependent stuff */
  338.     struct pane    *gr_pane;    /* pointer to pane cache entry */
  339.     struct pane    *gr_readpane;    /* pointer to pane cache entry */
  340.     int        gr_serial;    /* pane serial number */
  341.     int        gr_readserial;    /* pane serial number */
  342.     int        gr_vsync_int;    /* vsync interval */
  343.     int        gr_vsync_mod;    /* vsync remainder */
  344.     uint        gr_vsync_wakeup;/* counter value when wakeup happened */
  345.     struct rrm_rnode *gr_vsync_next;/* next guy in the list of sleepers */
  346. };
  347.  
  348. /*
  349.  * Element of a linked list of pointers to rendering nodes
  350.  */
  351. struct rrm_link {
  352.     struct rrm_rnode    *gl_rnp;
  353.     struct rrm_link        *gl_next;
  354. };
  355.  
  356.  
  357. /*
  358.  * Function prototypes.
  359.  */
  360.  
  361. struct gfx_data;
  362. struct gr2_pixeldma_args;
  363. extern int RRM_ValidFault(struct gfx_gfx *, void *);
  364. extern int RRM_Dispatch(struct gfx_gfx *,int,void *);
  365. extern void RRM_Init(struct gfx_data *);
  366. extern int RRM_Exit(struct gfx_gfx *);
  367. extern int RRM_CheckValidFault(struct gfx_gfx *);
  368. extern void rrmValidateBuffer(struct rrm_rnode *);
  369. extern void rrmValidateRetrace(struct rrm_rnode *);
  370. extern int rrmInvalidateRN(struct gfx_gfx *, struct rrm_rnode *,uint);
  371. extern void rrmUnMapGfx(struct gfx_gfx *);
  372. extern unsigned int rrmGetResourceMask(struct rrm_rnode *);
  373. extern void rrmSetResourceMask(struct gfx_gfx *, struct rrm_rnode *,
  374.                    register unsigned int);
  375. extern int rrmWaitVideoSync(struct gfx_gfx *, struct rrm_rnode *, int interval,
  376.                  int mod);
  377. extern void rrmValidateVideoSync(struct gfx_data *);
  378. #endif /* _KERNEL */
  379.  
  380. #endif /* __SYS_RRM_H__ */
  381.